home *** CD-ROM | disk | FTP | other *** search
/ By Popular Request 2.0 / By Popular Request 2.0 (Arsenal Computer).ISO / amiga_3 / ezbbs221.lha / Source / eazy2news.c < prev    next >
C/C++ Source or Header  |  1995-04-12  |  4KB  |  174 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <fcntl.h>
  5. #include <time.h>
  6. #include <proto/dos.h>
  7. #include <proto/exec.h>
  8.  
  9.  
  10.  
  11. /* ... from AmigaElm */
  12. #include "getsystime.c"
  13.  
  14.  
  15.  
  16. #define NEWS_BATCHSCRIPT    "MB_DATA:UUCP/DeliverNews.scp"
  17. #define NEWS_BATCHLOCK        "MB_DATA:UUCP/DeliverNews.lock"
  18. #define NEWS_BATCHNUM        "MB_DATA:UUCP/DeliverNews.num"
  19. #define NEWS_BATCHFILE        "MB_DATA:UUCP/News.%ld"
  20.  
  21.  
  22.  
  23. #define VERSION "1.9"
  24. static char *version = "\0$VER: eazy2news " VERSION " " __AMIGADATE__ "";
  25. /* static char *version = "\0$VER: eazy2news " VERSION " (" __DATE__ ")"; */
  26.  
  27. static char *day_names[] =
  28. {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
  29. static char *month_names[] =
  30. {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
  31.  
  32.  
  33.  
  34. void space2under(char *s)
  35. {
  36.     if (s) {
  37.         while (*s) {
  38.             if (*s == ' ')
  39.                 *s = '_';
  40.             s++;
  41.         }
  42.     }
  43. }
  44.  
  45.  
  46.  
  47. int main(int argc, char *argv[])
  48. {
  49.     if (argc == 7 && OpenTimer4MsgId()) {
  50.         char *excld = argv[2];
  51.         FILE *fp, *scp, *lock, *num;
  52.         long seqnum = 0;
  53.         char tmp[80];
  54.  
  55.         /* try to get lock */
  56.  
  57.         while (!(lock = fopen(NEWS_BATCHLOCK, "w")))
  58.             Delay(100);
  59.  
  60.         /* we have the lock, now want the maximum seq-number */
  61.  
  62.         if (num = fopen(NEWS_BATCHNUM, "r")) {
  63.             fscanf(num, "%ld", &seqnum);
  64.             fclose(num);
  65.         }
  66.  
  67.         ++seqnum;
  68.  
  69.         sprintf(tmp, NEWS_BATCHFILE, seqnum);
  70.  
  71.         if (seqnum > 1) {
  72.             while (!(scp = fopen(NEWS_BATCHSCRIPT, "a"))) {
  73.                 Delay(100);
  74.             }
  75.         }
  76.         else {
  77.             while (!(scp = fopen(NEWS_BATCHSCRIPT, "w"))) {
  78.                 Delay(100);
  79.             }
  80.             fprintf(scp, "failat 21\n");
  81.             fprintf(scp, "delete %s\n", NEWS_BATCHNUM);
  82.         }
  83.  
  84.         /* write back new seq-number while script-file is locked by us */
  85.         if (num = fopen(NEWS_BATCHNUM, "w")) {
  86.             fprintf(num, "%ld\n", seqnum);
  87.             fclose(num);
  88.         }
  89.  
  90.         /* now finish writing to script-file */
  91.         fprintf(scp, "relaynews -x %s -r -s <%s\ndelete %s\n", excld, tmp, tmp);
  92.  
  93.         if (fp = fopen(tmp, "w")) {
  94.             register int c = 0, last = 0;
  95.             time_t t;
  96.             struct timeval tv;
  97.             struct tm *ut;
  98.             char uname[16];
  99.             char *sname = argv[3];
  100.             char *ngrps = argv[1];
  101.             char *realn = argv[5];
  102.             char *sbjct = argv[6];
  103.  
  104.             /* for Date: */
  105.             time(&t);
  106.             ut = gmtime(&t);
  107.  
  108.             /* for Message-Id: */
  109.             GetTimer4MsgId(&tv);
  110.  
  111.             strcpy(uname, argv[4]);
  112.             space2under(uname);
  113.  
  114.             fprintf(fp, "Path: news\n");
  115.             fprintf(fp, "Newsgroups: %s\n", ngrps);
  116.             fprintf(fp, "From: %s@%s (%s)\n", uname, sname, realn);
  117.             fprintf(fp, "Sender: eazybbs@%s\n", sname);
  118.             fprintf(fp, "Subject: %s\n", sbjct);
  119.             fprintf(fp, "Message-Id: <%lx.%lx-eazybbs@%s>\n", tv.tv_secs, tv.tv_micro, sname);
  120.             fprintf(fp, "Date: %s, %.2d %s %d %.2d:%.2d:%.2d %sGMT\n",
  121.                 day_names[ut->tm_wday],
  122.                 ut->tm_mday, month_names[ut->tm_mon], ut->tm_year + 1900,
  123.                 ut->tm_hour, ut->tm_min, ut->tm_sec, ut->tm_isdst ? "DST" : "");
  124.             fprintf(fp, "MIME-Version: 1.0\n");
  125.  
  126.             /* This is not strictly MIME compliant, but who cares? */
  127.  
  128.             fprintf(fp, "Content-Type: text/plain; charset=ISO-8859-1\n");
  129.             fprintf(fp, "Content-Transfer-Encoding: 8bit\n");
  130.             fprintf(fp, "\n");
  131.  
  132.             while ((c = getchar()) != EOF) {
  133.                 if (last == '\\') {
  134.                     switch (c) {
  135.                     case '\\':
  136.                         fputc(c, fp);
  137.                         break;
  138.                     default:
  139.                         break;
  140.                     }
  141.                     last = 0;
  142.                 }
  143.                 else if (c == '\\') {
  144.                     last = c;
  145.                 }
  146.                 else {
  147.                     fputc(c, fp);
  148.                     last = c;
  149.                 }
  150.             }
  151.             fprintf(fp, "\n");
  152.  
  153.             fclose(fp);
  154.         }
  155.  
  156.         /* close script-file here to prevent it from being started */
  157.         fclose(scp);
  158.  
  159.         while (chmod(NEWS_BATCHSCRIPT, S_IWRITE | S_IREAD | S_IEXECUTE | S_IDELETE | S_ISCRIPT))
  160.             Delay(100);
  161.  
  162.         /* close lock-file here to prevent other ports from processing news */
  163.         fclose(lock);
  164.  
  165.         CloseTimer4MsgId();
  166.     }
  167.     else {
  168.         fprintf(stderr, "\033[1;33mEazyBBS\033[0m ⌐ 1988-1995 Andreas M. Kirchwitz\n"
  169.             "Usage: eazy2news \033[3m<newsgroup> <excl-cmd> <site> <user> <real> <subject> \033[0m <text\n");
  170.     }
  171.  
  172.     exit(0);
  173. }
  174.